package org.algorithm.二师兄.数组.三月.第二周;

/**
 * <p>
 *  给你一个整数数组nums 。「数组值」定义为所有满足0 <= i < nums.length-1的|nums[i]-nums[i+1]|的和。
 *
 *  你可以选择给定数组的任意子数组，并将该子数组翻转。但你只能执行这个操作一次 。
 *
 *  请你找到可行的最大 数组值。
 *</p>
 *  * 困难题   *
 * @author 二师兄
 * @date 2022/3/06   星期日
 * uri:  https://leetcode-cn.com/problems/reverse-subarray-to-maximize-array-value/
 */
public class 反转子数组取最大值 {

    public static void main(String[] args) {
        int[] nums = {2,4,9,24,2,1,10};
        System.out.println(maxValueAfterReverse(nums));
    }

    // 看的题解。。。。贪心后面重新搞这道题,  此题放弃
    public static int maxValueAfterReverse(int[] nums) {
        int ans=0,all=0;
        int n=nums.length;
        for(int i=0;i<n-1;i++)
            all+=Math.abs(nums[i]-nums[i+1]);

        int mn=Math.max(nums[0], nums[1]);
        int mx=Math.min(nums[0], nums[1]);
        for(int i=1;i<n;i++) {
            int t1=Math.min(nums[i], nums[i-1]);
            int t2=Math.max(nums[i], nums[i-1]);
            if(mn<t1) ans=Math.max(ans, t1-mn);
            if(mx>t2) ans=Math.max(ans, mx-t2);
            mn=Math.min(mn, t2);
            mx=Math.max(mx, t1);
        }
        ans*=2;
        for(int i=1;i<n;i++) {
            ans=Math.max(ans, Math.abs(nums[i]-nums[0])-Math.abs(nums[i]-nums[i-1]));
            ans=Math.max(ans, Math.abs(nums[n-i-1]-nums[n-1])-Math.abs(nums[n-i]-nums[n-i-1]));
        }
        return all+ans;
    }
}
